//
//  APIManager.swift
//  TestAPIManager
//
//  Created by 杨庆 on 2020/9/28.
//  Copyright © 2020 杨庆. All rights reserved.
//

import Foundation
import Moya

///**
// * APIManager 作为接口内容配置
// * 通过接口地址以及接口数据的组建
// */
//
///*
// 枚举的成员值跟其他类型的值关联存储在一起,
// 可以认为将值直接存入到枚举的内存中
// */
//enum APIManager {
//    case testApi
//    case testApiPara(_ para1:String,_ para2:String)
//    case testApiDict(_ Dict:[String:Any])
//    case getNbaInfo(_ getKey:String)
//}
//
//
//
///*
// * TargetType 设计理念
// * 先创建一个 enum,如
// * APIManager -> 代表你的服务器;
// * case1 2 3 ... -> 代表各个 API,(这样就能统一处理)
// * 还可以针对个别 API 做不同处理;
// * 设置好了配置,就可以简单创建 provider 了
// */
//
//extension APIManager:TargetType { /* TargetType:用于定义“MoyaProvider”所需规范的协议*/
//
//    var baseURL: URL {
//        return  URL.init(string: "http://op.juhe.cn/onebox/basketable/")!
//    }
//
//    var path: String {
//        switch self {
//        case .testApi:
//            return "nba"
//        case .testApiPara(let para1,let para2):
//            return "nba"
//        case .testApiDict:
//            return "nba"
//        case .getNbaInfo:
//            return "nba"
//        }
//    }
//
//    var method: Moya.Method {
//        switch self {
//        case .testApi:
//            return .get
//        default:
//            return .post
//        }
//    }
//
//    var sampleData: Data {
//        return "".data(using: String.Encoding.utf8)!
//    }
//
//    var task: Task {
//        switch self {
//        case .testApi:
//            return .requestPlain
//        case let .testApiPara(para1,_):
//            return .requestParameters(parameters: ["key":para1], encoding: URLEncoding.default)
//        case .testApiDict(let dict):
//            return .requestParameters(parameters: dict, encoding: JSONEncoding.default)
//        case .getNbaInfo(let getKey):
//            return .requestParameters(parameters: ["key":getKey], encoding: URLEncoding.default)
//        }
//    }
//
//    var headers: [String : String]? {
//        return ["Content-Type":"application/x-www-form-urlencoded"]
//    }
//
//    /*
//     TargetType 协议保证了每个 enum 的值被转换为了一个完整的 request , 每个完整的 request 被分割成了 BaseURL ,
//     指定 request 子路径的 Path ,定义 HTTP 方法的 method 和指定了 request 的参数和参数编码的 task.
//
//     * 到这里为基本 API 网络层添加了足够的信息. 默认情况下, Moya 将所有给定的部分合并成一个完成的请求.
//     (sampleData 属性的实现:用于本地测试,属于附加)
//
//     完整的 request 包含:
//     1. BaseURL
//     2. Path -> request子路径
//     3. method -> http 方法
//     4. task ->参数和参数编码 (URLEncoding.default , JSONEncoding.default)
//     */
//
//}
//

/*封装接口 URL 地址工具类 NetPort */
struct NetPort {
    
    enum Port:String {

        static let baseURLString:String = "http://www.baidu.com"
       
        case testAPIPath = "/dictPath"
        case testAPIParaPath = "/infoPath"
        case testAPIDicPath = "/dicPath"
        case getNbaInfoPath = "/getInfoPath"
    }
}


extension NetPort.Port {
    
    func fullPath()->String {
        return NetPort.Port.baseURLString + rawValue
    }
}


enum GitHub {
    case testAPI
    case testAPIPara( _ para1:String, _ para2:String)
    case testAPIDic( _ Dic:[String:Any])
    case getNbaInfo( _ getKey:String)
}


extension GitHub:TargetType {
    var baseURL: URL {
        return URL(string: NetPort.Port.baseURLString)!
    }
    
    var path: String {
        switch self {
        case .testAPI:
            return NetPort.Port.testAPIPath.fullPath()
        case .testAPIPara:
            return NetPort.Port.testAPIParaPath.fullPath()
        case .testAPIDic:
            return NetPort.Port.testAPIDicPath.fullPath()
        case .getNbaInfo:
            return NetPort.Port.getNbaInfoPath.fullPath()
        default:
            return "nba"
        }
    }
    
    var method: Moya.Method {
        switch self {
        case .testAPI:
            return .get
        default:
            return .post
        }
    }
    
    var sampleData: Data {
        return "".data(using: .utf8)!
    }
    
    /* 配置参数 */
    var task: Task {
        switch self {
        case .testAPI:
            return .requestPlain // 没有附加数据请求
        case .testAPIPara(let para1,let para2):
            return .requestParameters(parameters: ["key":para1], encoding: URLEncoding.default)
        case .testAPIDic(let dic):
            return .requestParameters(parameters: dic, encoding: JSONEncoding.default)
        case .getNbaInfo(let getkey):
            return .requestParameters(parameters: ["getKey":getkey], encoding: URLEncoding.default)
        }
    }
    
    var headers: [String : String]? {
        return ["Content-Type":"application/x-www-form-urlencoded"]
    }
    
    
}
